# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/28 17:17 
@Author  : ZhangShenao 
@File    : decorator_with_param.py 
@Desc    : 带参数的装饰器
如果要实现带参数的装饰器,就需要在原来的装饰器基础上,再嵌套一层装饰器
"""
import datetime
import functools


def time(time_format: str):
    """
    @time装饰器,可以在函数执行时,打印当前执行时间
    :param time_format: 时间格式
    """

    def decorator(func):
        """
        装饰器函数
        :param func: 被装饰的函数
        """

        @functools.wraps(func)  # 使用@functools.wraps装饰器,可以保留被装饰函数的元信息,如函数名,参数列表等
        def wrapper(*args, **kwargs):
            """
            装饰器的逻辑
            :param args: 可变参数列表
            :param kwargs: 关键字参数列表
            :return: 返回被装饰的函数
            """

            # 打印当前执行时间
            print(f'[{datetime.datetime.now().strftime(time_format)}]')

            # 调用被装饰的函数,透传参数,并返回结果
            return func(*args, **kwargs)

        # 返回装饰器
        return wrapper

    # 返回装饰器函数
    return decorator


# 在函数上使用@time装饰器,并传入时间格式
@time('%Y-%m-%d %H:%M:%S')
def say_hello(name: str):
    print(f'hello: {name}')


# 调用被装饰的函数
say_hello('zsa')

# 这个装饰器等价于
# say_hello = time('%Y-%m-%d %H:%M:%S')(say_hello)
